﻿using System;
using System.Text;
using System.Threading;
using RabbitMQDemo.Common;

namespace RabbitMQDemo.Producer
{
    public class Simple
    {
        private const string QueueName = "simple_queue";

        public static void Send(string[] args)
        {
            using var connection = MQClient.GetConnection();
            using var channel = connection.CreateModel();

            /*
             * 声明队列
             *  queue: 队列名称
             *  durable: 设置是否持久化, true表示队列为持久化, 持久化的队列会存盘, 在服务器重启的时候会保证不丢失相关信息
             *  exclusive: 设置是否排他, true表示队列为排他的, 如果一个队列被设置为排他队列, 该队列仅对首次声明它的连接可见, 并在连接断开时自动删除
             *  autoDelete: 设置是否自动删除。为true 则设置队列为自动删除
             *  arguments: 设置队列的其他一些参数, 如 x-message-ttl等
            */
            channel.QueueDeclare(queue: QueueName, durable: false, exclusive: false, autoDelete: false, arguments: null);

            // channel.BasicReturn += (sender, args) =>
            // {
            //     Console.WriteLine($"BasicReturn: {args.RoutingKey}->{Encoding.UTF8.GetString(args.Body.ToArray())}");
            // };

            // var properties = channel.CreateBasicProperties();
            // properties.MessageId = "111";
            // properties.Persistent = true;

            var index = 0;
            while (index < 10)
            {
                /*
                 * 发送消息
                 *  exchange: 交换机，为空表示使用默认的交换机
                 *  routingKey: 路由Key，默认的路由Key和队列名称完全一致
                 *  mandatory: 如果为true, 消息不能路由到指定的队列时，会触发channel.BasicReturn事件，如果为false，则broker会直接将消息丢弃
                 *  basicProperties: 消息属性
                 *  body: 消息内容
                 */
                channel.BasicPublish(exchange: "", routingKey: QueueName, mandatory: false, basicProperties: null, body: GetMessage(index));

                Thread.Sleep(1000);
                Console.WriteLine("Send simple message");
                index++;
            }
        }

        private static byte[] GetMessage(int? i = null) => Encoding.UTF8.GetBytes($"[Simple]{(i.HasValue ? $"[{i}]" : string.Empty)} message");
    }
}
